<?php
/**
 * 字符串辅助类
 *
 * @version $Id: IStringHelper.php 312 2008-04-23 16:29:38Z iwind $
 * @package util.lang
 */
class IStringHelper extends IObject {
    /**
    * 中文截取  
 	*
 	* 截取方法
    * - 把一个中文当作一个字符来看待.
    *
    * 使用方法  
    * - IStringHelper::substring("this is an example", 5)
    * - IStringHelper::substring("this is an example", 5, 10);
    *
    * @param string $string 被截取的字符串
    * @param integer $start  开始截取的地方
    * @return string 截取结果
    */
    public static function substring($string, $start) {
    	$args = func_get_args();
    	if (function_exists("mb_substr")) {
    		$string = (isset($args[2]))?mb_substr($string, $start, $args[2], "GBK"):mb_substr($string, $start, strlen($string) + 1, "GBK");
    		return $string; 	
    	}
        $m = IStringHelper::getChars($string);
        if (isset($args[2])) {
            return implode("", array_slice($m, $start, $args[2]));
        }
        else {
            return implode("", array_slice($m, $start));
        }
    }

    /**
    * 将一个中文当作双字节来算的截取
    * 
    * @param string $string 被截取的字符串
    * @param integer $start 开始截取的地方
    * @return string 截取结果
    */
    public static function substring2($string, $start) {
        $array = IStringHelper::getChars($string);
        $args = func_get_args();
      	if (isset($args[2])) $len = intval($args[2]); 
        $count = 0;
        $result = "";
        if (!empty($array)) {
        	foreach ($array as $v) {
        		$count += strlen($v);
        		if ($count >= $start) {
        			if (isset($len)) {
        				if ($count <= $len) {
        					$result .= $v;	
        				}
        				else {
        					break;	
        				}
        			}
        			else {
        				$result .= $v;	
        			}
        		}	
        	}	
        }
        return $result;
    }
    
    /**
    * 从一字符串左边截取一定长度的子字符串
    *
    * @param string $string 要截取的字符串
    * @param integer $length 截取长度
    * @param boolean $multi 是把把一个中文当两个字节算
    * @return string 截取的结果
    */
    public static function left($string, $length, $multi = false) {
    	$length = intval($length);
		return ($multi)?IStringHelper::substring2($string, 0, $length):IStringHelper::substring($string, 0, $length);    	
    }
    
    /**
    * 从一字符串右边截取一定长度的子字符串
    *
    * @param string $string 要截取的字符串
    * @param integer $length 截取长度
    * @param boolean $multi 是把把一个中文当两个字节算
    * @return string 截取的结果
    */
    public static function right($string, $length, $multi = false) {
    	$length = intval($length);
    	$string = strrev($string);
		return strrev(($multi)?IStringHelper::substring2($string, 0, $length):IStringHelper::substring($string, 0, $length));    	
    }
    
    /**
    * 将对象转换成字符串
    * 
    * @param mixed $object 一个任意的对象
    * @return string 转换结果
    */
    public static function toString($object) {
        return strval($object);
    }

    /**
    * 将一个字符串转换成一个数组,数组包含所有字符.
    * 
    * @param string $string 要转换的字符串
    * @return array 字符数组
    */
    public static function getChars($string) {
    	$m = null;
        preg_match_all("/[\x81-\xfe]?./", $string, $m);
        return $m[0];
    }

    /**
    * 得到一个字符串的长度,将中文当单字节算
    * 
    * @param string $string 要计算的字符串
    * @return integer 计算结果
    */
    public static function length($string) {
        return count(IStringHelper::getChars($string));
    }

   	/**
    * 验证一个字符串是否只含中文,全角,数字,英文,下划线
    * 
    * @param string string 要检查的字符串
    * @return boolean
    */
    public static function checkChs($string) {
        $chars = IStringHelper::getChars($string);
        foreach ($chars as $char) {
            if (strlen($char) == 1 && !preg_match("/[a-z0-9_]/i", $char)) {
                return false;
            }
        }
        return true;
    }

    /**
    * 计算一个字符串中含另一个字符的个数
    * 
    * @param string $string 被操作字符串
    * @param string $sub 子字符串
    * @return integer 个数
    */
    public function getNeedleCount($string, $sub) {
        return substr_count($string, $sub);
    }
    
    /**
    * 计算两个字符串之间的相似度，以第一个字符串为基准
    * 
    * @param string $string1 第一个字符串
    * @param string $string2 第二个字符串
    * @return float 一个含二位小数的数字
    */
    public static function similar($string1, $string2) {
    	$similarity = null;
    	similar_text($string1, $string2, $similarity);
    	return round(0.01 * $similarity, 2);    		
    }
}

?>